# micro编辑器构建配置文件
# 用于自动化编译、安装、测试等流程管理

# 声明伪目标，避免与同名文件冲突
.PHONY: runtime build generate build-quick build-dbg install test clean

# -------------------------- 版本信息变量 --------------------------
# 版本号：通过工具脚本生成，包含主版本和修订号
VERSION = $(shell go run tools/build-version.go)
# Git提交哈希：获取当前代码的短哈希值，用于版本标识
HASH = $(shell git rev-parse --short HEAD)
# 编译日期：生成编译时间戳
DATE = $(shell GOOS=$(shell go env GOHOSTOS) GOARCH=$(shell go env GOHOSTARCH) \
	go run tools/build-date.go)
# 额外链接器标志：平台特定元数据（如macOS的Info.plist）
ADDITIONAL_GO_LINKER_FLAGS = $(shell go run tools/info-plist.go "$(GOOS)" "$(VERSION)")
# Go二进制安装路径（默认：$GOPATH/bin）
GOBIN ?= $(shell go env GOPATH)/bin
# 版本信息注入：编译时将版本信息嵌入二进制文件
GOVARS = -X github.com/zyedidia/micro/v2/internal/util.Version=$(VERSION) \
         -X github.com/zyedidia/micro/v2/internal/util.CommitHash=$(HASH) \
         -X 'github.com/zyedidia/micro/v2/internal/util.CompileDate=$(DATE)'
# 调试模式标志：启用调试日志
DEBUGVAR = -X github.com/zyedidia/micro/v2/internal/util.Debug=ON
# VSCode测试用例URL：用于生成编辑器测试代码
VSCODE_TESTS_BASE_URL = 'https://raw.githubusercontent.com/microsoft/vscode/e6a45f4242ebddb7aa9a229f85555e8a3bd987e2/src/vs/editor/test/common/model/'

# -------------------------- 主要构建目标 --------------------------
# 完整构建流程：先执行代码生成，再进行快速构建
build: generate build-quick

# 快速构建：直接编译二进制文件（不执行代码生成）
# -trimpath: 移除编译路径中的GOPATH和GOROOT
# -ldflags: 链接器标志，-s/-w移除符号表和调试信息减小文件体积
build-quick:
	go build -trimpath -ldflags "-s -w $(GOVARS) $(ADDITIONAL_GO_LINKER_FLAGS)" -mod=vendor  ./cmd/micro

# 调试版本构建：包含调试符号和调试日志
build-dbg:
	go build -trimpath -ldflags "-s -w $(ADDITIONAL_GO_LINKER_FLAGS) $(DEBUGVAR)" -mod=vendor ./cmd/micro

# 带标签构建：获取最新Git标签后构建
build-tags: fetch-tags generate
	go build -trimpath -ldflags "-s -w $(GOVARS) $(ADDITIONAL_GO_LINKER_FLAGS)" -mod=vendor ./cmd/micro

# 构建所有目标（当前仅包含基础构建）
build-all: build

# -------------------------- 安装目标 --------------------------
# 安装到系统：先执行代码生成，再安装到GOBIN目录
install: generate
	go install -ldflags "-s -w $(GOVARS) $(ADDITIONAL_GO_LINKER_FLAGS)" -mod=vendor ./cmd/micro

# 安装所有组件（当前仅包含基础安装）
install-all: install

# -------------------------- 辅助目标 --------------------------
# 获取Git标签：拉取远程标签用于版本生成
fetch-tags:
	git fetch --tags

# 代码生成：生成运行时资源（语法高亮、帮助文档等）
generate:
	go generate ./runtime

# 测试代码生成：从VSCode测试用例生成编辑器模型测试
# 依赖TypeScript编译器(tsc)将测试文件转换为JavaScript
# 然后通过testgen.go生成Go测试代码

testgen:
	mkdir -p tools/vscode-tests
	cd tools/vscode-tests && \
	curl --remote-name-all $(VSCODE_TESTS_BASE_URL){editableTextModelAuto,editableTextModel,model.line}.test.ts
	tsc tools/vscode-tests/*.ts > /dev/null; true
	go run tools/testgen.go tools/vscode-tests/*.js > buffer_generated_test.go
	mv buffer_generated_test.go internal/buffer
	gofmt -w internal/buffer/buffer_generated_test.go

# 运行单元测试：执行所有内部包和命令包的测试

test:
	go test ./internal/...
	go test ./cmd/...

# 性能基准测试：运行3次取平均值，结果保存到文件
bench:
	for i in 1 2 3; do \
		go test -bench=. ./internal/...; \
	done > benchmark_results
	benchstat benchmark_results

# 基准测试基线：生成性能对比基线数据
bench-baseline:
	for i in 1 2 3; do \
		go test -bench=. ./internal/...; \
	done > benchmark_results_baseline

# 对比基准测试：比较当前性能与基线数据
bench-compare:
	for i in 1 2 3; do \
		go test -bench=. ./internal/...; \
	done > benchmark_results
	benchstat -alpha 0.15 benchmark_results_baseline benchmark_results

# 清理构建产物：删除生成的可执行文件
clean:
	rm -f micro
